#!/usr/bin/python
# author dennis
# 2022年06月15日
import multiprocessing
import os, time, random

"""
    当需要创建的子进程数量不多，可以直接利用multiprocessing中的process动态生成多个进程，
但如果目标成百上千，手动创建的工程量非常的巨大，可以用Pool方法

初始化Pool----(新的请求到Pool)----->没有满----->创建一个新的
                           ----->满了------>请求等待
"""


def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d" % (msg, os.getpid()))  # 只有3个服务员
    # random.random()随机生成0~1之间的浮点数
    time.sleep(random.random() * 2)
    t_stop = time.time()
    print(msg, "执行完毕，耗时%0.2f" % (t_stop - t_start))


if __name__ == '__main__':
    po = multiprocessing.Pool(3)
    for i in range(10):
        # 异步派任务：进程不需要一直等待下去，而是继续执行下面的操作
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker, (i,))

    print("---start----")
    po.close()  # 关闭进程池，关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成，必须放在close语句之后
    print("-----end-----")


